package com.delayTask;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author 大忽悠
 * @create 2022/9/20 14:59
 */
@Slf4j
public abstract class AbstractDelayTaskQueue implements DelayTaskQueue{
    /**
     * <p>
     * 取消taskId对应的延迟任务
     * </p>
     *
     * @param taskId 延迟任务标记
     */
    @Override
    public void cancel(DelayTaskEvent taskId) {
        if(taskId.getDelay(TimeUnit.MILLISECONDS)<=0L){
            handleSubmitAfterExpired(taskId);
            return;
        }
        handleSubmit(taskId);
    }

    /**
     * <p>
     *     处理延迟任务正常提交
     * </p>
     * @param taskId 延迟任务
     */
    protected void handleSubmit(DelayTaskEvent taskId){
        taskId.cancelDelayEvent();
    };

    /**
     * 延迟任务在任务已经被取消的情况下提交
     * @param taskId 延迟任务
     */
    protected void handleSubmitAfterExpired(DelayTaskEvent taskId){
        log.error("当前延迟任务因为到期已经被取消了,不能提交,被取消的延迟任务信息详细如下:  "+taskId);
    };
}
